#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>

using namespace std;

/*
信号集操作
*/
void pendingPrint(const sigset_t& pending)
{
    for(int sig = 31; sig >= 1; --sig)
    {
        if(sigismember(&pending, sig)) { cout << '1'; }
        else { cout << '0'; }
    }
    cout << endl;
}

void sighandler(int signo)
{
    cout << "get a signal: " << signo << endl;
    //exit(0);
}

int main()
{
    for(int sig = 1; sig <= 31; ++sig) {
        signal(sig, sighandler);
    }

    sigset_t mySigset; sigemptyset(&mySigset);
    sigset_t oldSigset;
    // sigaddset(&mySigset, 2);
    sigfillset(&mySigset);
    sigprocmask(SIG_SETMASK, &mySigset, &oldSigset);
    sigset_t pending;
    int cnt = 0;
    while(true)
    {
        sigpending(&pending);
        pendingPrint(pending);
        ++cnt;
        if(cnt == 10) {
            cout << "signal all released..." << endl;
            sigemptyset(&mySigset);
            sigprocmask(SIG_SETMASK, &mySigset, nullptr);
            exit(0);
            // cout << "signal 11 handled..." << endl;
            // sigprocmask(SIG_SETMASK, &oldSigset, nullptr);
        }
        sleep(1);
    }
    return 0;
}

/*
alarm
*/
// void sighandler(int signo)
// {
//     cout << "get a signal: " << signo << endl;
//     int ret = alarm(3);
//     cout << ret << " seconds last..." << endl;
// }

// int main()
// {
//     signal(SIGALRM, sighandler);
//     alarm(3);
//     while(true)
//     {
//         cout << "process is running... pid:" << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }

/*
异常产生的信号
*/
// void sighandler(int signo)
// {
//     cout << "get a signal: " << signo << endl;
// }

// void errWork_1()
// {
//     int a = 10;
//     int res = a / 0;
// }

// void errWork_2()
// {
//     int* p = nullptr;
//     *p = 10;
// }

// int main()
// {
//     //signal(8, sighandler);
//     //signal(11, sighandler);
//     cout << "before:" << endl;
//     sleep(1);
//     errWork_2();
//     cout << "after:" << endl;
//     //cout << res << endl;
//     return 0;
// }

/*
对信号的自定义捕捉
*/
// void sighandler(int signo)
// {
//     cout << "get a signal: " << signo << endl;
// }

// int main()
// {
//     signal(2, sighandler);
//     while(true)
//     {
//         cout << "i am a process, pid: " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }